\chapter{Модель данных}

Опираясь на требования к приложению, описанные в предыдущем разделе, можно разработать логическую модель данных. Предполагается использование реляционной СУБД, так что удобно представить модель на ER-диаграмме. На рисунке \ref{pic:er_model} изображена ER-диаграмма модели данных с использованием нотации IDEF1X. \cite{idef1x}

\begin{figure}[ht]
\centering
\includegraphics[width=\linewidth]{res/pic/er_model}
\caption{ER-модель данных}
\label{pic:er_model}
\end{figure}

Ниже приведённые сущности описаны подробнее.
\begin{enumerate}
\item \textbf{Выплата} (cash). Выдача некоторой суммы денег студенту.
	\begin{itemize}
	\item \textbf{cash\_id}~--- уникальный идентификатор выплаты в базе данных.
	\item \textbf{payment}~--- количество выплаченных денег.
	\end{itemize}
\item \textbf{Группа студентов} (stud\_group). Объединение студентов для совместного посещения занятий и сдачи экзаменов.
	\begin{itemize}
	\item \textbf{stud\_group\_id}~--- уникальный идентификатор группы студентов в базе данных.
	\item \textbf{name}~--- название группы, идентифицирующее её в реальном мире.
	\item \textbf{enter\_date}~--- дата формирования группы.
	\end{itemize}
\item \textbf{Дисциплина} (discipline). Область знаний, по которой производится обучение и проверка знаний. Экзамены бывают по определённым дисциплинам.
	\begin{itemize}
	\item \textbf{discipline\_id}~--- уникальный идентификатор дисциплины в базе данных.
	\item \textbf{name}~--- название дисциплины в учебном плане.
	\end{itemize}
\item \textbf{Заявление на матпомощь} (welfare\_request). Запрос, подаваемый студентом, в котором он просит оказать ему материальную помощь, поясняет причину и, возможно, необходимую сумму.
	\begin{itemize}
	\item \textbf{welfare\_request\_id}~--- уникальный идентификатор заявления на матпомощь в базе данных.
	\item \textbf{request\_date}~--- дата подачи заявления.
	\item \textbf{request\_cash}~--- сумма, которую просит студент.
	\item \textbf{description}~--- обоснование необходимости материальной помощи и прочая информация, предоставляемая студентом.
	\end{itemize}
\item \textbf{Изменение Фонда социальной защиты} (ssf\_diff). История изменений финансов в фонде социальной защиты.
	\begin{itemize}
	\item \textbf{ssf\_diff\_id}~--- уникальный идентификатор изменения Фонда социальной защиты в базе данных.
	\item \textbf{diff\_date}~--- дата изменения.
	\item \textbf{balance}~--- величина изменения; отрицательная, если часть денег из фонда была потрачена.
	\end{itemize}
\item \textbf{Категория студентов} (stud\_class). Категория льгот для студентов. Каждый студент может обладать сразу несколькими категориями.
	\begin{itemize}
	\item \textbf{stud\_class\_id}~--- уникальный идентификатор категории студентов в базе данных.
	\item \textbf{name}~--- название льготной категории, удобное для понимания человеком.
	\item \textbf{payment}~--- выплата материальной помощи, полагающаяся студентам данной категории.
	\item \textbf{coefficient}~--- коэффициент перед минимальной стипендией в случае выплаты стипендии.
	\item \textbf{restriction}~--- флаг, сигнализирующий, что данная категория запрещает выдачу стипендий и социальных пособий.
	\end{itemize}
\item \textbf{Минимальный размер оплаты труда} (min\_wage). Настройка величины, относительно которой измеряется стипендия, с историей изменений.
	\begin{itemize}
	\item \textbf{min\_wage\_id}~--- уникальный идентификатор минимальный размера оплаты труда в базе данных.
	\item \textbf{money}~--- сумма минимальной выплаты.
	\item \textbf{actual\_date}~--- дата, начиная с которой стипендии выплачиваются, опираясь на такую сумму.
	\end{itemize}
\item \textbf{Пользователь} (users). Лицо, зарегистрированное в системе и использующее её с какой бы то ни было целью.
	\begin{itemize}
	\item \textbf{users\_id}~--- уникальный идентификатор пользователя в базе данных.
	\item \textbf{name}~--- имя пользователя, используемое для входа в систему.
	\item \textbf{email}~--- адрес электронной почты пользователя для обратной связи.
	\item \textbf{password}~--- секретный пароль, известный только конкретному пользователю и использующийся для аутентификации.
	\end{itemize}
\item \textbf{Пособие} (welfare). Разовая выплата студенту, нуждающемуся в улучшении материального положения.
	\begin{itemize}
	\item \textbf{welfare\_id}~--- уникальный идентификатор пособия в базе данных.
	\item \textbf{welfare\_date}~--- дата выплаты материальной помощи.
	\end{itemize}
\item \textbf{Роль} (role). Роль, которую пользователь играет в системе. Определяет его права и функциональность интерфейса.
	\begin{itemize}
	\item \textbf{role\_id}~--- уникальный идентификатор роли в базе данных.
	\item \textbf{name}~--- название роли, понятное пользователю.
	\end{itemize}
\item \textbf{Сессия} (sess). Экзаменационная сессия. Проходит в определённые сроки на определённой специальности и определяет экзамены, которые студенты должны сдать. Только сдавший сессию студент имеет право получать стипендию.
	\begin{itemize}
	\item \textbf{sess\_id}~--- уникальный идентификатор сессии в базе данных.
	\item \textbf{semester\_number}~--- номер семестра, в конце которого сдаётся сессия.
	\item \textbf{start\_date}~--- дата начала сессии.
	\item \textbf{end\_date}~--- дата окончания сессии.
	\end{itemize}
\item \textbf{Специальность} (speciality). Направление подготовки студентов. Характеризуется набором сессий с экзаменами по определённым специальностям.
	\begin{itemize}
	\item \textbf{speciality\_id}~--- уникальный идентификатор специальности в базе данных.
	\item \textbf{name}~--- название специальности в соответствии с федеральным стандартом.
	\end{itemize}
\item \textbf{Стипендия} (scolarship). Ежемесячная выплата студенту за то, что он сдал сессию.
	\begin{itemize}
	\item \textbf{scolarship\_id}~--- уникальный идентификатор стипендии в базе данных.
	\end{itemize}
\item \textbf{Студент} (student). Лицо, обучающееся в университете. Может получать стипендии и пособия.
	\begin{itemize}
	\item \textbf{stud\_id}~--- уникальный идентификатор студента в базе данных.
	\item \textbf{record\_book}~--- номер зачётной книжки.
	\item \textbf{grade\_level}~--- год обучения (номер курса).
	\item \textbf{enter\_date}~--- дата поступления в университет.
	\end{itemize}
\item \textbf{Факультет} (faculty). Структурное подразделение университета, занимающееся обучением студентов.
	\begin{itemize}
	\item \textbf{faculty\_id}~--- уникальный идентификатор факультета в базе данных.
	\item \textbf{name}~--- название факультета, под которым он функционирует в университете.
	\end{itemize}
\item \textbf{Фонд социальной защиты} (ssf). Источник выплат с историей изменений.
	\begin{itemize}
	\item \textbf{ssf\_id}~--- уникальный идентификатор фонда социальной защиты в базе данных.
	\item \textbf{money}~--- сумма, содержащаяся в фонде.
	\item \textbf{actual\_date}~--- дата, начиная с которой сумма актуальна.
	\end{itemize}
\item \textbf{Член комиссии} (commitee). Член факультетской или стипендиальной комиссии. Относится к определённому факультету, так что имеет право назначать стипендии или пособия только студентам того же факультета.
	\begin{itemize}
	\item \textbf{commitee\_id}~--- уникальный идентификатор члена комиссии в базе данных.
	\end{itemize}
\item \textbf{Экзамен} (examination). Испытание, которое студент должен пройти во время сессии, чтобы получить возможность продолжить обучение и получать стипендию.
	\begin{itemize}
	\item \textbf{examination\_id}~--- уникальный идентификатор экзамена в базе данных.
	\item \textbf{examination\_date}~--- дата экзамена, назначенная учебным отделом.
	\end{itemize}
\end{enumerate}

Надо понимать, что это лишь логическая модель данных, так что в процессе реализации реальная физическая схема базы данных может незначительно отличаться. В частности, могут различаться названия таблиц, а также отношения многие-ко-многим вырождаются в отдельные таблицы. Видно, что схема получилась довольно объёмная.

Что касается нормализации отношений, то можно заметить, что отношения находятся в третьей нормальной форме. Это обусловлено тремя фактами:\begin{enumerate}
\item Каждый атрибут любого отношения является неделимым и содержит только одно значение (первая нормальная форма).
\item Каждый атрибут, не входящий в состав ключа, функционально полно зависит от ключа (вторая нормальная форма).
\item Каждый атрибут, не входящий в состав ключа, находится от него в нетранзитивной зависимости (третья нормальная форма).
\end{enumerate}

Это достаточный уровень нормализации отношений, так что в дальнейшей нормализации нет необходимости. 

Целостность данных обеспечивается простейшими ограничениями (constraint) на базу данных вроде FOREIGN KEY и NOT NULL. Что касается дальнейших особенностей обеспечения целостности, относящихся к логике приложения, их имеет смысл обсепечивать уже на уровне работы приложения, не позволяя создаться ситуации нарушения целостности в базе.
